#!/usr/bin/env python
# coding: utf-8

# In[1]:


l = sorted([36, 5, -12, 9, -21], key = abs)
print(l)


# In[2]:


l = sorted(['Abc', 'bbb', 'Casdf', 'daDAA'], key = str.lower)
print(l)


# In[4]:


l = sorted(['Abc', 'bbb', 'Casdf', 'daDAA'], key = str.lower, reverse = True)
l


# In[5]:


L = [('Bob', 75), ('Adam', 92), ('Bart', 66), ('Lisa', 88)]
#要根据名字排序，
#by_name 就应该将一个tuple的第0个元素取出
def by_name(t):
    return t[0]
l = sorted(L, key = by_name)
print(l)


# In[17]:


L = [('Bob', 75), ('Adam', 92), ('Bart', 66), ('Lisa', 88)]
#要根据名字排序，倒序！！
#by_name 就应该将一个tuple的第0个元素取出
def by_name(t):
    return t[0]
l = sorted(L, key = by_name, reverse = True)
print(l)


# In[19]:


L = [('Bob', 75), ('Adam', 92), ('Bart', 66), ('Lisa', 88)]
#要根据成绩排序，倒序！！
#by_name 就应该将一个tuple的第1个元素取出
def by_score(t):
    return t[1]
l = sorted(L, key = by_score, reverse = True)
print(l)


# In[50]:


##正则表达式
#匹配mr_开头的字符串，不区分大小写
import re
pattern = r'^mr_\w'#pattern = r'^mr_.*' 可匹配后面的所有；\w代表一个字符
string = 'MR_A mr_a'#有空格也是字符串
result = re.match(pattern, string, re.I) #re.I是不区分大小写
print(result)


# In[26]:


print(result.start(), result.end(), result.group())


# In[28]:


#检测中国移动电话号码
import re
pattern = r'^(13[4-9]\d{8})|(15[01289]{8})$'
num = input('please enter a mobile number:')
result = re.match(pattern,num)
if result != None:
    print(num, 'is a mobile number of China Mobile.')
else:
    print(num, 'is not a mobile number of China Mobile.')


# In[29]:


#search 的使用，只识别全文中的匹配的第一个
import re
pattern = r'mr_\w'
string = 'ganraozifuMR_A mr_a'
result = re.search(pattern, string, re.I)
print(result)


# In[31]:


#舆情危险词的判定
import re
pattern = r'(黑客)|(抓包)|(监听)|(Tro_jan)'
sentence = '我是一个程序员，我喜欢看黑客的书，想研究一下Trojan'
result = re.search(pattern, sentence)

print(result)
if result == None:
    print('安全')
else:
    print('危险')


# In[35]:


#舆情危险词的判定
import re
pattern = r'(黑客)|(抓包)|(监听)|(Trojan)'
sentence = '我是一个程序员，我喜欢看黑客的书，想研究一下Trojan'

result = re.sub(pattern, '马赛克', sentence) #sub是子串,把匹配的串替换成中间的参数
print(result)


# In[37]:


#舆情危险词的判定
import re
pattern = r'(黑客)|(抓包)|(监听)|(Trojan)'
sentence = '我是一个程序员，我喜欢看黑客的书，想研究一下Trojan'
result = re.findall(pattern, sentence)
print(result)


# In[39]:


#舆情危险词的判定
import re
pattern = r'(黑客)|(抓包)|(监听)|(Trojan)'
sentence = '我是一个程序员，我喜欢看黑客的书，想研究一下Trojan'
result = re.findall(pattern, sentence)
for r in result:
    for t in r:
        if t != '':
            print(t)
    


# In[41]:


#利用split方法，按照一定的pattern，分割一个字符串
import re
strl = '@王一博 @蔡徐坤 @肖战 @迪丽热巴'
pattern = r'\s*@'
namelist = re.split(pattern, strl)
print('您@的好友有：')
for friend in namelist:
    if friend != '':
        print(friend)


# In[43]:


from functools import reduce
def power(a,b):
    return a ** b
reduce(power,[1,2,3,4,5])


# In[45]:


L = [1,2,3,4,5]
L[:3]


# In[46]:


S = 'ABCDEF'
S[:-1:2]


# In[47]:


list(map(abs,[-1,-2,3,-4,5]))


# In[6]:


#爬取静态网页之新浪滚动新闻的爬取
import requests
import re

from bs4 import BeautifulSoup #解析
import lxml

#爬虫的源头，根url
url = "http://roll.news.sina.com.cn/news/gnxw/gdxw1/index.shtml"
#下载源头网页的源码
res = requests.get(url)
res.encoding = 'gb2312' # 可以解析，或者用 res.encoding = res.apparent_encoding
# print(res.text[:500])  还得按安装 request

#从根网页的源码中找到那些需要爬取的新闻网址
#https://news.sina.com.cn/o/2018-11-06/doc-ihmutuea7351575.shtml
#https://news.sina.com.cn/c/2018-10-16/doc-ihmhafir9302901.shtml

pattern = r'http://news.sina.com.cn/[a-z]{1}/[0-9a-z/.\-]+shtml'#用正则表达式
urls = re.findall(pattern, res.text)
print(len(urls))

#获取新闻网页内容

def getnewspage(url):
    
    res = requests.get(url)
    res.encoding = 'utf-8'
    return res.text

def savepage(page, filename):
    f = open(filename, 'wb') #wb是二进制
    f.write(page.encode('utf-8'))
    f.close()

#爬取网页,把每一个网页地址下载下来
for u in urls:
    pc = getnewspage(u)
    filename = 'E:\\news\\' + u[u.rindex('/') + 1:u.rindex('.')]
    savepage(pc, filename)
    
    
p = getnewspage(urls[0]) #把第一个爬取的新闻拿出来
soup = BeautifulSoup(p,'lxml')

#<h1 class="main-title">著名表演艺术家朱旭去世 享年88岁</h1>
node = soup.select("h1.main-title") #定位
print(node)


# In[3]:


#爬取静态网页之新浪滚动新闻的爬取
import requests
import re

from bs4 import BeautifulSoup #解析
import lxml

#爬虫的源头，根url
url = "http://roll.news.sina.com.cn/news/gnxw/gdxw1/index.shtml"
#下载源头网页的源码
res = requests.get(url)
res.encoding = 'gb2312' # 可以解析，或者用 res.encoding = res.apparent_encoding
# print(res.text[:500])  还得按安装 request

#从根网页的源码中找到那些需要爬取的新闻网址
#https://finance.sina.com.cn/money/future/2022-07-22/doc-imizirav4959189.shtml

pattern = r'http://news.sina.com.cn/[a-z]{1}/[0-9a-z/.\-]+shtml'
urls = re.findall(pattern, res.text)
print(len(urls))

#获取新闻网页内容

def getnewspage(url):
    
    res = requests.get(url)
    res.encoding = 'utf-8'
    return res.text

def savepage(page, filename):
    f = open(filename, 'wb') #wb是二进制
    f.write(page.encode('utf-8'))
    f.close()

#爬取网页,把每一个网页地址下载下来
for u in urls:
    pc = getnewspage(u)
    filename = 'E:\\news\\' + u[u.rindex('/') + 1:u.rindex('.')]
    savepage(pc, filename)
    
    
p = getnewspage(urls[0]) #把第一个爬取的新闻拿出来
soup = BeautifulSoup(p,'lxml')

#<h1 class="main-title">著名表演艺术家朱旭去世 享年88岁</h1>
node = soup.select("h1.main-title") #定位
print(node[0].text.strip())  #.text就是中间的内容·+[0]就是字符串，strip去空
source = soup.select(".source")
print(source[0].text.strip())

#<a href="https://mp.weixin.qq.com/s?__biz=MjM5ODgwODY2MA==&mid=2736814076&idx=1&sn=6d4f24e806e59775090705647f66b440&chksm=8011cac7b76643d15fff08ebea5a9b15b2af1120ed235f21771042a53da42d6148950662f5ec&scene=0&xtrack=1" target="_blank" class="source" data-sudaclick="content_media_p" rel="nofollow">中国经济网</a>


# In[ ]:


#爬取静态网页之新浪滚动新闻的爬取
import requests
import re
from bs4 import BeautifulSoup
import lxml 

##爬虫源头王爷的源码
#url = "http://roll.news.sina.com.cn/news/gnxw/gdxw1/index.shtml"

#下载源码
#res = requests.get(url)
#res.encoding = 'gb2312'
#res.encoding
#print(res.text[:500])
#从根网页的源码中找到那些需要爬取的新闻网址
#pattern = r'http://news.sina.com.cn/[a-z]{1}/[0-9a-z/.\-]+shtml'
#urls = re.findall(pattern,res.text)

#print(len(urls))
#print(res.text)

#获取新闻网页内容
def getnewspage(url):
    res = requests.get(url)
    res.encoding = 'utf-8'
    return res.text
#保存至本地文件
def savepage(page,filename):
    f = open(filename,'wb')
    f.write(page.encode('utf-8'))
    f.close()

pno = 5#爬几页
#循环爬取
for p in range(1,pno+1):
    #构造根网页的网址
    url = 'http://roll.news.sina.com.cn/news/gnxw/gdxw1/index_{pn}.shtml'.format(pn = p)
    #下载根网页的源码
    res = requests.get(url)
    res.encoding = 'gb2312'
    #urls保存王爷对应的网页链接，是个列表
    pattern = r'http://news.sina.com.cn/[a-z]{1}/[0-9a-z/.\-]+shtml'
    urls = re.findall(pattern,res.text)    
#遍历urls，依次爬取网页内容
    for u in urls:                                                                                                                   
        pc = getnewspage(u)
        filename = 'E:\\news\\' + u[u.rindex('/')+1:u.rindex('.')] + '.txt'
        savepage(pc,filename)


# In[6]:


from bs4 import BeautifulSoup
from datetime import datetime
import os
import traceback

#读取指定目录中的每个html文件
#解析，提取：标题、时间、作者、来源、正文
#保存在本地文件中

def get_news(htmlfile):
    #新闻信息字典
    news_dict = {}
    #打开并读取文件
    try:
        #打开文件
        f = open(htmlfile, encoding = 'utf-8')
        #读取文件
        fcontent = f.read()
        #转为DOM树
        soup = BeautifulSoup(fcontent, 'lxml')
        # 提取标题title。（数据清洗）
        #select 方法作用于h1.main-title获得的是一个列表，
        #我们事先确定main-title是独一无二的，因此，列表只有一个元素
        #因此，soup.select('h1.main-title')[0]拿到了带有标签信息的标签元素总体信息
        #我们要的是，实际内容，不要标签描述。采用.text获得。
        news_title = soup.select('h1.main-title')[0].text.strip()
        # 装进字典
        news_dict['title'] = news_title
        # 获取时间,soup.select('span.date')[0].text.strip()是字符串
        nt = datetime.strptime(soup.select('span.date')[0].text.strip(), '%Y年%m月%d日 %H:%M')
        news_time = datetime.strftime(nt, '%Y-%m-%d %H:%M')
        #装进字典
        news_dict['time'] = news_time
        #获取新闻源
        news_source = soup.select('.source')[0].text.strip()
        #装进字典
        news_dict['source'] = news_source
        #获取作者
        news_author = soup.select('.show_author')[0].text.strip()
        #装进字典
        news_dict['author'] = news_author
        #获取正文
        news_article  =soup.select('div#article > p')
        #news_article 存储的是一个包含若干个div标签的子标签p的列表(>是子标签）。
        # 我们要遍历这个列表，将每一个p中的信息提取出来，连接在一起，即为正文内容。
        news_article_text = ''
        for na in news_article:
            news_article_text += na.text.strip()
        # 装进字典
        news_dict['article'] = news_article_text
    except Exception as e:
        print('抓取出错，此条新闻略过')
        print(e)
        traceback.print_exc()
        return None
    #print(htmlfile)
    #print('time: %s title: %s author: %s source: %s' %(news_time,news_title,news_author,news_source))
    return news_dict

# 保存所有新闻内容 （保存正文）,将newslist中的正文，保存到filename
def save_text(filename, newslist):
    newstext = ''
    #neslist是一个字典列表，每个元素n都是一个新闻字典
    for n in newslist:
         newstext += n['article'] + '\r\n'
    #保存文件
    f = open(filename, 'wb')
    f.write(newstext.encode('utf-8'))
    f.close()

if __name__ == '__main__':
    htmldir = "E:\\news"
    #遍历新闻文件夹
    fs = os.walk(htmldir)
    #用列表allnews来装载所有新闻字典
    allnews = []
    #遍历所有的目录和文件
    for d, s, fns in fs: #d是根目录 （str),s是子目录列表（list),fns是文件名列表（list)
        #遍历文件
        for fn in fns:
            
            singlenews = get_news(htmldir + os.sep + fn)
            #singlenews = get_news(os.path.abspath(fn))
            if singlenews != None:
                allnews.append(singlenews)
    #将allnews保存至E:\news\news.txt中
    save_text(r'E:\news\news.txt',allnews)
        


# In[ ]:




